package com.pokermind.repository.dao;

import java.util.List;
import java.util.Optional;

/**
 * 基础DAO接口
 * 定义通用的CRUD操作
 * 
 * @param <T> 实体类型
 * @param <ID> 主键类型
 * @author PokerMind Team
 */
public interface BaseDao<T, ID> {
    
    /**
     * 保存实体
     * @param entity 实体对象
     * @return 保存后的实体（包含生成的ID）
     */
    T save(T entity);
    
    /**
     * 批量保存实体
     * @param entities 实体列表
     * @return 保存的实体数量
     */
    int batchSave(List<T> entities);
    
    /**
     * 根据ID查找实体
     * @param id 主键ID
     * @return 实体对象，如果不存在返回empty
     */
    Optional<T> findById(ID id);
    
    /**
     * 查找所有实体
     * @return 所有实体列表
     */
    List<T> findAll();
    
    /**
     * 根据ID更新实体
     * @param entity 实体对象
     * @return 更新的行数
     */
    int update(T entity);
    
    /**
     * 根据ID删除实体
     * @param id 主键ID
     * @return 删除的行数
     */
    int deleteById(ID id);
    
    /**
     * 删除实体
     * @param entity 实体对象
     * @return 删除的行数
     */
    int delete(T entity);
    
    /**
     * 检查ID是否存在
     * @param id 主键ID
     * @return true如果存在，false如果不存在
     */
    boolean existsById(ID id);
    
    /**
     * 统计总数
     * @return 实体总数
     */
    long count();
}